﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperKit
{
    public class MediaExecutor : CommandExecutor {
        public static string FFMpegExe => ConfigReader.Instance.GetString("FFMpegPath");

        // 宽高，如果其中一个配置为0，则表示不设置此参数
        protected int width;
        protected int height;
        // 如果配置为0，表示不配置此参数，如果配置为-1，表示使用默认值。
        protected float bytesRate;
        // 是否使用硬件加速
        protected bool gpu;
        protected string ext;


        public MediaExecutor(ArgReader arg, IExecutorOwner form, string fpath) : base(arg, form, fpath) {
            width = arg.GetInteger("-width", 0);
            height = arg.GetInteger("-height", 0);
            bytesRate = arg.GetFloat("-bytesRate", -1f);
            gpu = arg.IsContain("-gpu");
            ext = arg.GetParameter("-ext", "");
        }

        protected float BytesRate {
            get {
                if (bytesRate < 0) {
                    return Cfg.DefaultBytesRate;
                } else {
                    return bytesRate;
                }
            }
        }

        public string SizeStr {
            get {
                return width == 0 || height == 0 ? "" : $"-s {width}x{height}";
            }
        }

        public string ByteStr {
            get {
                return BytesRate > 0.01f ? $"-b:v {BytesRate}M" : "";
            }
        }


        public string ExecuteFFMpeg(string cmd) {
            Process p = new Process();
            //设置要启动的应用程序
            p.StartInfo.FileName = FFMpegExe;
            p.StartInfo.Arguments = cmd;
            //是否使用操作系统shell启动
            p.StartInfo.UseShellExecute = true;
            // 接受来自调用程序的输入信息
            //p.StartInfo.RedirectStandardInput = true;
            //输出信息
            //p.StartInfo.RedirectStandardOutput = true;
            // 输出错误
            //p.StartInfo.RedirectStandardError = true;
            //不显示程序窗口
            p.StartInfo.CreateNoWindow = true;
            //启动程序
            p.Start();

            //等待程序执行完退出进程
            p.WaitForExit();
            p.Close();

            return Kit.EMPTY;
        }

    }
}
